package com.sxhuayuan.parking.utils;

import com.sun.management.OperatingSystemMXBean;

import java.io.File;
import java.lang.management.ManagementFactory;
import java.math.BigDecimal;

/**
 * 系统信息读取
 * 
 * @author helong
 * @create 2019-04-08 10:01
 */
public class SystemInfoUtils {

	private static OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
	private static final int MB = 1024 * 1024;
	private static final int GB = 1024 * 1024 * 1024;
	private static File root = new File("/");

	/**
	 * 获取CPU核心数
	 * 
	 * @return
	 */
	public static int getCpuCore() {
		return Runtime.getRuntime().availableProcessors();
	}

	/**
	 * 获取CPU负载
	 * 
	 * @return
	 */
	public static double getSystemCpuLoad() {

		return round(mul(osmxb.getSystemCpuLoad(), 100.0), 2);

	}

	/**
	 * 获取jvm线程负载
	 * 
	 * @return
	 */
	public static double getJvmThreadLoad() {

		return round(mul(osmxb.getProcessCpuLoad(), 100.0), 2);

	}

	/**
	 * 获取总的物理内存(MB)
	 * 
	 * @return
	 */
	public static long getTotalMemorySize() {
		return osmxb.getTotalPhysicalMemorySize() / MB;
	}

	/**
	 * 获取已使用的物理内存(MB)
	 * 
	 * @return
	 */
	public static long getUsedMemory() {
		return (osmxb.getTotalPhysicalMemorySize() - osmxb.getFreePhysicalMemorySize()) / MB;
	}

	/**
	 * 获取内存利用率
	 * 
	 * @return
	 */
	public static double getMemoryCount() {
		return round(mul(getUsedMemory() * 1.0 / getTotalMemorySize(), 100.0), 2);

	}

	/**
	 * 获取磁盘根目录大小(GB)
	 * 
	 * @return
	 */
	public static double getDiskTotalSpace() {

		return round(root.getTotalSpace() * 1.0 / GB, 2);

	}

	/**
	 * 获取已经使用的磁盘空间(GB)
	 * 
	 * @return
	 */
	public static double getDiskUseSpace() {

		return round((root.getTotalSpace() - root.getUsableSpace()) * 1.0 / GB, 2);

	}

	/**
	 * 获取磁盘利用率
	 * 
	 * @return
	 */
	public static double getDiskUtilizationRate() {

		return round(mul(getDiskUseSpace() / getDiskTotalSpace(), 100.0), 2);
	}

	/**
	 * 提供精确的乘法运算。
	 * 
	 * @param v1
	 *            被乘数
	 * @param v2
	 *            乘数
	 * @return 两个参数的积
	 */
	public static double mul(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.multiply(b2).doubleValue();
	}

	/**
	 * 提供精确的小数位四舍五入处理。
	 * 
	 * @param v
	 *            需要四舍五入的数字
	 * @param scale
	 *            小数点后保留几位
	 * @return 四舍五入后的结果
	 */
	public static double round(double v, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		BigDecimal b = new BigDecimal(Double.toString(v));
		BigDecimal one = new BigDecimal("1");
		return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

}
